#ifndef _TCP_H_
#define _TCP_H_


#include <stdint.h>
#include "list.h"


#define TCP_BACKLOG         (4)
#define TCP_SESSION_MAX     (1024)


typedef struct list_node list_t;

typedef struct {
    int sock; // sock fd

    union {
        void *ptr;
        int  data;
    } user;

    list_t node;
} tcp_sess_t;

typedef struct {
    int sock; // private
    int port; // server or client init

    int epfd; // private for server
    int (*on_sock)(void *ptr);    // server init
    int (*on_open)(tcp_sess_t *s); // server init
    int (*on_recv)(tcp_sess_t *s); // server init
    int (*on_exit)(tcp_sess_t *s); // server init

    char *addr; // client init

    list_t head;
} tcp_t;


int tcp_new_srv(tcp_t *srv);
int tcp_new_cli(tcp_t *cli);

int sendbuf(int sock, void *buf, int len);
int recvbuf(int sock, void *buf, int len);
int sendall(int sock, void *buf, int len);
int recvall(int sock, void *buf, int len);

#endif
